package com.trendata.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Date;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;

/**
 * 处理网络
 * 
 * @author: HuangXiuXiu Email:243559392@qq.com
 */
public class HttpClientUtil {

	private static Logger log = Logger.getLogger(HttpClientUtil.class);

	/**
	 * 发送https请求
	 * 
	 * @param requestUrl
	 *            请求地址
	 * @param requestMethod
	 *            请求方式（GET、POST）
	 * @param outputStr
	 *            提交的数据
	 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
	 */
	public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
		JSONObject jsonObject = null;
		try {
			// 创建SSLContext对象，并使用我们指定的信任管理器初始化
			TrustManager[] tm = { new MyX509TrustManager() };
			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
			sslContext.init(null, tm, new java.security.SecureRandom());
			// 从上述SSLContext对象中得到SSLSocketFactory对象
			SSLSocketFactory ssf = sslContext.getSocketFactory();

			URL url = new URL(requestUrl);
			HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
			conn.setSSLSocketFactory(ssf);

			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			// 设置请求方式（GET/POST）
			conn.setRequestMethod(requestMethod);

			// 当outputStr不为null时向输出流写数据
			if (null != outputStr) {
				OutputStream outputStream = conn.getOutputStream();
				// 注意编码格式
				outputStream.write(outputStr.getBytes("UTF-8"));
				outputStream.close();
			}

			// 从输入流读取返回内容
			InputStream inputStream = conn.getInputStream();
			InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
			BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
			String str = null;
			StringBuffer buffer = new StringBuffer();
			while ((str = bufferedReader.readLine()) != null) {
				buffer.append(str);
			}

			// 释放资源
			bufferedReader.close();
			inputStreamReader.close();
			inputStream.close();
			inputStream = null;
			conn.disconnect();
			jsonObject = JSONObject.fromObject(buffer.toString());
		} catch (ConnectException ce) {
			log.error("连接超时：{}", ce);
		} catch (Exception e) {
			log.error("https请求异常：{}", e);
		}
		return jsonObject;
	}

	/**
	 * 返回的是HttpsUrlConnection
	 * 
	 * @param requestUrl
	 * @param requestMethod
	 * @return
	 */
	public static HttpsURLConnection httpsRequest(String requestUrl, String requestMethod) {
		HttpsURLConnection conn = null;
		try {
			// 创建SSLContext对象，并使用我们指定的信任管理器初始化
			TrustManager[] tm = { new MyX509TrustManager() };
			SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
			sslContext.init(null, tm, new java.security.SecureRandom());
			// 从上述SSLContext对象中得到SSLSocketFactory对象
			SSLSocketFactory ssf = sslContext.getSocketFactory();

			URL url = new URL(requestUrl);
			conn = (HttpsURLConnection) url.openConnection();
			conn.setSSLSocketFactory(ssf);

			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setUseCaches(false);
			// 设置请求方式（GET/POST）
			conn.setRequestMethod(requestMethod);

			// 释放资源
		} catch (ConnectException ce) {
			log.error("连接超时：{}", ce);
		} catch (Exception e) {
			log.error("https请求异常：{}", e);
		}
		return conn;
	}

	/**
	 * URL编码（utf-8）
	 * 
	 * @param source
	 * @return
	 */
	public static String urlEncodeUTF8(String source) {
		String result = source;
		try {
			result = java.net.URLEncoder.encode(source, "utf-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 根据内容类型判断文件扩展名
	 * 
	 * @param contentType
	 *            内容类型
	 * @return
	 */
	public static String getFileExt(String contentType) {
		String fileExt = "";
		if ("image/jpeg".equals(contentType))
			fileExt = ".jpg";
		else if ("audio/mpeg".equals(contentType))
			fileExt = ".mp3";
		else if ("audio/amr".equals(contentType))
			fileExt = ".amr";
		else if ("video/mp4".equals(contentType))
			fileExt = ".mp4";
		else if ("video/mpeg4".equals(contentType))
			fileExt = ".mp4";
		return fileExt;
	}

	/**
	 * 获得一个http连接
	 * 
	 * @param url
	 *            链接地址
	 * @return
	 * @throws MalformedURLException
	 * @throws IOException
	 */
	public static HttpURLConnection getHttpURLConnection(String url) throws MalformedURLException, IOException {
		if (url.contains("http://")) {
			url = "http://" + url.substring(url.indexOf("http://") + "http://".length()).replaceAll("//", "/");
		} else if (url.contains("https://")) {
			url = "https://" + url.substring(url.indexOf("https://") + "https://".length()).replaceAll("//", "/");
		}

		HttpURLConnection httpURLConnection = (HttpURLConnection) new URL(url).openConnection();
		httpURLConnection.setConnectTimeout(50000);
		httpURLConnection.setReadTimeout(50000);
		httpURLConnection.setUseCaches(false);
		httpURLConnection.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
		httpURLConnection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8,en;q=0.6");
		httpURLConnection.setRequestProperty("Cache-Control", "max-age=0");
		httpURLConnection.setRequestProperty("Host", getHost(url));
		httpURLConnection.setRequestProperty("User-Agent",
				"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36");
		httpURLConnection.setRequestProperty("Date", TimeUtil.getRfc822DateFormat(new Date()));
		httpURLConnection.setInstanceFollowRedirects(true);

		return httpURLConnection;
	}

	/**
	 * 获得host
	 * 
	 * @param url
	 *            地址
	 * @return
	 */
	public static String getHost(String url) {
		int startIndex = -1;
		if (url.contains("http://")) {
			startIndex = url.indexOf("http://") + "http://".length();
		} else if (url.contains("https://")) {
			startIndex = url.indexOf("https://") + "https://".length();
		} else {
			return null;
		}

		int endIndex = url.indexOf("/", startIndex);
		if (endIndex == -1) {
			endIndex = url.length();
		}

		return url.substring(startIndex, endIndex);
	}

	/**
	 * 获得图片的流
	 * 
	 * @param picUrl
	 *            图片地址
	 * @return
	 * @throws Exception
	 */
	public static InputStream getInputStream(String picUrl) throws Exception {
		HttpURLConnection httpURLConnection = getHttpURLConnection(picUrl);
		httpURLConnection.connect();

		return httpURLConnection.getInputStream();
	}

	/**
	 * 获得请求内容类型
	 * 
	 * @param picUrl
	 *            图片地址
	 * @return
	 * @throws Exception
	 */
	public static String getContentType(String picUrl) throws Exception {
		HttpURLConnection httpURLConnection = getHttpURLConnection(picUrl);

		httpURLConnection.connect();

		InputStream inputStream = httpURLConnection.getInputStream();
		if (inputStream != null) {
			try {
				inputStream.close();
			} catch (Exception e) {
			}
		}

		return httpURLConnection.getContentType();
	}
}
